/* eslint-disable no-empty-pattern */
import { api_add, api_delById, api_modifyAll, api_queryById } from '@/api/crud'
import { api_login, api_logout, api_patchStatus, api_patchPassword, api_listAll } from '@/api/sys_admin'

import { setJwtToCookie, getRolesFromJwt, getPurviewsFromJwt } from '@/utils/jwt'
import { clearAllCookie } from '@/utils/cookie'
import { clearAllLStorage, clearAllSStorage, setLStorage, setLStorageObj } from '@/utils/web-storage'

import { isEmptyObj } from '@/utils/validate'

import store from '@/store'

const pathName = 'admin'

const state = {}

const mutations = {}

const actions = {
  // 添加管理员
  add({}, sysAdmin) {
    return new Promise((resolve, reject) => {
      api_add(pathName, sysAdmin)
        .then(() => {
          resolve()
        })
        .catch((error) => {
          reject(error)
        })
    })
  },
  // 执行用户登录验证
  login({}, LoginInfo) {
    return new Promise((resolve, reject) => {
      api_login(LoginInfo)
        .then((response) => {
          // 如果后台对登录数据验证成功后会返回jwt和admin对象
          // 1、得到服务器端返回的jwt并保存到 cookie 里
          const jwt = response.headers.authorization
          if (!jwt || jwt === '') {
            reject(new Error('从服务器获取令牌失败，无法登录！请联系开发人员！'))
          }
          // 将 jwt 存到 cookie 里
          setJwtToCookie(jwt)

          // 2、获取管理员信息，注意：此时得到的管理员不包含角色权限信息
          const adminInfo = response.data.data
          if (!adminInfo) {
            reject(new Error('从服务器获取管理员信息失败，无法登录！请联系开发人员！'))
          }
          if (!adminInfo.IsEnabled) {
            reject(new Error('管理员暂未启用，请联系系统管理员！'))
          }
          // 获取管理员对象并存到 LStorage 里
          setLStorageObj('AdminInfo', adminInfo)
          // ('SET_ADMIN_INFO', adminInfo)

          // 3、获取管理员菜单
          const menuJson = adminInfo.Menu
          if (!menuJson || menuJson === '') {
            reject(new Error('管理员未分配权限，请联系系统管理员！'))
          }
          try {
            const objMenu = JSON.parse(menuJson).menu
            if (isEmptyObj(objMenu)) {
              reject(new Error('管理员未分配权限，请联系系统管理员！'))
            }
            // 将管理员的menu转成json字符串格式后存到 LStorage 里
            setLStorage('MenuJson', JSON.stringify(objMenu))
          } catch {
            reject(new Error('获取管理员权限菜单错误，请联系开发人员！'))
          }

          // 4、将角色和权限保存到 LocalStorage 中
          const roles = getRolesFromJwt(jwt)
          const purviews = getPurviewsFromJwt(jwt)
          setLStorageObj('Roles', roles)
          setLStorageObj('Purviews', purviews)

          resolve()
        })
        .catch((error) => {
          reject(error)
        })
    })
  },
  // 用户安全登出
  logout({}) {
    return new Promise((resolve, reject) => {
      api_logout()
        .then(() => {
          // 清除cookie中数据，包括 jwt、账号、密码、系统设置（如上传设置等）
          clearAllCookie()
          // 清除webstorage里的数据，包括登录成功后的 管理员信息、菜单json等
          clearAllSStorage()
          clearAllLStorage()
          // 清除 store 里的动态路由
          store.dispatch('sys_router/clearRoutesDynamic')
          resolve()
        })
        .catch((error) => {
          reject(error)
        })
    })
  },
  // 删除管理员
  delById({}, id) {
    return new Promise((resolve, reject) => {
      api_delById(pathName, id)
        .then(() => {
          resolve()
        })
        .catch((error) => {
          reject(error)
        })
    })
  },
  // 修改管理员
  modifyAll({}, sysAdmin) {
    return new Promise((resolve, reject) => {
      api_modifyAll(pathName, sysAdmin)
        .then(() => {
          resolve()
        })
        .catch((error) => {
          reject(error)
        })
    })
  },
  // 修改管理员启用状态
  patchStatus({}, paramsJson) {
    return new Promise((resolve, reject) => {
      api_patchStatus(paramsJson)
        .then(() => {
          resolve()
        })
        .catch((error) => {
          reject(error)
        })
    })
  },
  // 管理员修改自己密码
  modifyPassword({}, paramsJson) {
    return new Promise((resolve, reject) => {
      api_patchPassword(paramsJson)
        .then(() => {
          resolve()
        })
        .catch((error) => {
          reject(error)
        })
    })
  },
  // 超级管理员重置管理员密码
  resetPasswordBySuper({}, paramsJson) {
    return new Promise((resolve, reject) => {
      api_patchPassword(paramsJson)
        .then(() => {
          resolve()
        })
        .catch((error) => {
          reject(error)
        })
    })
  },
  // 根据id查询到一个管理员全部资料
  queryById({}, id) {
    return new Promise((resolve, reject) => {
      api_queryById(pathName, id)
        .then((response) => {
          resolve(response.data.data)
        })
        .catch((error) => {
          reject(error)
        })
    })
  },
  // 得到所有管理员的列表
  listAll({}, type) {
    return new Promise((resolve, reject) => {
      api_listAll(type)
        .then((response) => {
          resolve(response.data.data)
        })
        .catch((error) => {
          reject(error)
        })
    })
  },
}

export default {
  namespaced: true,
  state,
  mutations,
  actions,
}
